package br.com.funaction.eventtcontrollerv2.controller;

import java.util.List;
import java.io.IOException;
import java.sql.SQLException;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import br.com.funaction.eventtcontrollerv2.entities.Anunciante;
import br.com.funaction.eventtcontrollerv2.entities.Anuncio;
import br.com.funaction.eventtcontrollerv2.entities.Franquia;
import br.com.funaction.eventtcontrollerv2.entities.PDV;
import br.com.funaction.eventtcontrollerv2.model.AnuncianteDAO;
import br.com.funaction.eventtcontrollerv2.model.PDVDAO;

@RequestScoped
@ManagedBean
public class CadastroAnuncianteMB {

	Anunciante anunciante = new Anunciante();
	Anuncio anuncio = new Anuncio();
	PDV pdv = new PDV();
	PDVDAO pdvDAO = new PDVDAO();
	private List<PDV> listaPDV;
	AnuncianteDAO anuncianteDAO = new AnuncianteDAO();
	Franquia franquia = new Franquia();
	FacesContext contexto = FacesContext.getCurrentInstance();
	
	@PostConstruct
	public void init(){
		
		try{
			
			autenticacao();
			
		} catch(Exception e){
			
			this.franquia.setId(1);
		}
		
		try{
			
			listaPDV();
			
		} catch(Exception e){
			
		}
	}
	
	private void autenticacao() throws IOException{
		
		franquia = (Franquia) contexto.getExternalContext().getSessionMap().get("franquia");
		if(franquia == null){
			
			ExternalContext contextoExterno = contexto.getExternalContext();
			contextoExterno.redirect("/eventt-controller-v2/jsf/login/login.jsf");
			return;
		}
	}
	
	public void cadastraAnunciante() throws SQLException, IOException{
		
		anunciante.setIdFranquia(franquia.getId());
		if(anunciante.getPfPj()==1){
			cadastraPF();
		} else{
			cadastraPJ();
		}
	}
	
	private void cadastraPF() throws SQLException, IOException{
		
		try{
			anuncianteDAO.persistPF(anunciante, anuncio.getSelecaoPDV());
			contexto.addMessage(null, new FacesMessage("Sucesso!", "Anunciante cadastrado."));
		} catch (SQLException e){
			contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
					"Falha!", "Erro ao cadastrar anunciante. " + 
							"Contate o administrador do sistema. Erro " + 
							e.getErrorCode()));;
		}
		
		ExternalContext contextoExterno = contexto.getExternalContext();
		contextoExterno.redirect("/eventt-controller-v2/index.jsf");
		return;
	}
	
	private void cadastraPJ() throws IOException{
		
		try{
			anuncianteDAO.persistPJ(anunciante, anuncio.getSelecaoPDV());
			contexto.addMessage(null, new FacesMessage("Sucesso!", "Anunciante cadastrado."));
		} catch (SQLException e){
			contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
					"Falha!", "Erro ao cadastrar anunciante. " + 
							"Contate o administrador do sistema. Erro " + 
							e.getErrorCode()));;
		}
		
		ExternalContext contextoExterno = contexto.getExternalContext();
		contextoExterno.redirect("/eventt-controller-v2/index.jsf");
		return;
	}
	
	public void listaPDV() throws SQLException{
		
		pdv.setIdFranquia(franquia.getId());
		
		listaPDV = pdvDAO.listaTodosPDVAnuncio(pdv);
	}

	public List<PDV> getListaPDV() {
		return listaPDV;
	}

	public void setListaPDV(List<PDV> listaPDV) {
		this.listaPDV = listaPDV;
	}

	public Anunciante getAnunciante() {
		return anunciante;
	}

	public void setAnunciante(Anunciante anunciante) {
		this.anunciante = anunciante;
	}

	public Anuncio getAnuncio() {
		return anuncio;
	}

	public void setAnuncio(Anuncio anuncio) {
		this.anuncio = anuncio;
	}
}